home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / dev / c / nroot.lha / nroot.c next >
Encoding:
C/C++ Source or Header  |  2002-08-01  |  1.2 KB  |  92 lines

  1.  
  2. #include <errno.h>
  3.  
  4. double nroot(long int,double);
  5. static double root(long int,double);
  6. static double rpow(double,long int);
  7. static double sqr(double);
  8.  
  9. double nroot(long int n,double x)
  10. {
  11. double result;
  12. int olderr=errno;
  13.  
  14. if (n<1)
  15.     {
  16.     errno=EDOM;
  17.     return 0;
  18.     }
  19. if (x<0)
  20.     {
  21.     if (n%2) 
  22.         {
  23.         result= -root(n,-x);
  24.         errno=olderr;
  25.         }
  26.     else
  27.         {
  28.         errno=EDOM;
  29.         return 0;
  30.         }
  31.     }
  32. else
  33.     {
  34.     result=root(n,x);
  35.     errno=olderr;
  36.     } 
  37. return result;
  38. }
  39.  
  40. /*****************************************************************/
  41.  
  42. static double root(long int n,double x)
  43. {
  44. double res,low=0,mid,upp=1;
  45.  
  46. if (n==1) return x;
  47. if (x==0) return 0;
  48.  
  49. while ((res=rpow(upp,n))<x)
  50.     {
  51.     low=upp;
  52.     upp*=2;
  53.     }
  54. if (res==x) return upp;
  55.  
  56. mid=low+((upp-low)/2);
  57.  
  58. do
  59.     {
  60.     res=rpow(mid,n);
  61.     if (res<x)
  62.         {
  63.         low=mid;
  64.         mid+=((upp-mid)/2);
  65.         }
  66.     else if (res>x)
  67.         {
  68.         upp=mid;
  69.         mid-=((mid-low)/2);
  70.         }
  71.     else return mid;
  72.     } while (upp-mid); 
  73.  
  74. return mid;
  75. }
  76.  
  77. /*****************************************************************/
  78.  
  79. static double rpow(double a,long int n)
  80. {
  81. if (n==1) return a;
  82. if (n%2) return (a*sqr(rpow(a,n/2)));
  83. else return sqr(rpow(a,n/2));
  84. }
  85.  
  86. /*****************************************************************/
  87.  
  88. static double sqr(double a)
  89. {
  90. return (a*a);
  91. }
  92.